;; FILENAME = santi.asm
;; MIT License

;; Copyright (c) 2025 三体自动化技术协会

;; Permission is hereby granted, free of charge, to any person obtaining a copy
;; of this software and associated documentation files (the "Software"), to deal
;; in the Software without restriction, including without limitation the rights
;; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
;; copies of the Software, and to permit persons to whom the Software is
;; furnished to do so, subject to the following conditions:

;; The above copyright notice and this permission notice shall be included in all
;; copies or substantial portions of the Software.

;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
;; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
;; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
;; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
;; SOFTWARE.
    
    
    ;; 清空画布 - 用循环清空整个屏幕（使用INC优化）
    PUSH 0           ; 初始y=0
    clear_y_loop:
    PUSH 0           ; 初始x=0
    clear_x_loop:
    
    ;; 设置当前坐标的字符为空格(32) - 参数顺序: x, y, char
    DUP              ; 复制x
    SWAP             ; 交换x和y，现在栈顶是y
    OVER             ; 复制x，现在栈顶是x
    PUSH 32          ; 空格字符
    SETU             ; 设置字符
    
    ;; x加1（使用INC指令优化）
    INC              ; 使用INC指令替代PUSH 1 ADD
    
    ;; 检查x是否小于64
    DUP
    PUSH 64
    LT
    JUMPIF clear_x_loop  ; 如果x<64，继续内层循环
    
    ;; x循环结束，y加1（使用INC指令优化）
    POP              ; 弹出x
    SWAP             ; 交换，让y在栈顶
    INC              ; 使用INC指令替代PUSH 1 ADD
    DUP              ; 复制y
    PUSH 64
    LT
    JUMPIF clear_y_loop  ; 如果y<64，继续外层循环

    POP              ; 弹出y
    
    ;; 三体自动化技术协会logo设计
    
    ;; 中心三体系统 - 更加复杂的轨道设计
    PUSH 32 PUSH 18 PUSH #x25CF SETU  ; 中心天体
    PUSH 24 PUSH 22 PUSH #x25CF SETU  ; 左天体
    PUSH 40 PUSH 22 PUSH #x25CF SETU  ; 右天体
    
    ;; 复杂轨道系统 - 三体混沌轨迹
    PUSH 28 PUSH 16 PUSH #x25E6 SETU  ; 轨道点1
    PUSH 26 PUSH 18 PUSH #x25E6 SETU  ; 轨道点2
    PUSH 28 PUSH 20 PUSH #x25E6 SETU  ; 轨道点3
    PUSH 32 PUSH 21 PUSH #x25E6 SETU  ; 轨道点4
    PUSH 36 PUSH 20 PUSH #x25E6 SETU  ; 轨道点5
    PUSH 38 PUSH 18 PUSH #x25E6 SETU  ; 轨道点6
    PUSH 36 PUSH 16 PUSH #x25E6 SETU  ; 轨道点7
    PUSH 32 PUSH 15 PUSH #x25E6 SETU  ; 轨道点8
    
    ;; 自动化技术齿轮系统 - 双层齿轮设计
    ;; 外层大齿轮
    PUSH 32 PUSH 10 PUSH #x25CB SETU  ; 齿轮中心
    PUSH 32 PUSH 8 PUSH #x2588 SETU   ; 上齿
    PUSH 29 PUSH 9 PUSH #x2588 SETU   ; 左上齿
    PUSH 35 PUSH 9 PUSH #x2588 SETU   ; 右上齿
    PUSH 27 PUSH 11 PUSH #x2588 SETU  ; 左齿
    PUSH 37 PUSH 11 PUSH #x2588 SETU  ; 右齿
    PUSH 29 PUSH 13 PUSH #x2588 SETU  ; 左下齿
    PUSH 35 PUSH 13 PUSH #x2588 SETU  ; 右下齿
    PUSH 32 PUSH 14 PUSH #x2588 SETU  ; 下齿
    
    ;; 内层小齿轮
    PUSH 32 PUSH 10 PUSH #x25CF SETU  ; 内齿轮中心
    PUSH 32 PUSH 9 PUSH #x2591 SETU   ; 内齿轮上齿
    PUSH 31 PUSH 10 PUSH #x2591 SETU  ; 内齿轮左齿
    PUSH 33 PUSH 10 PUSH #x2591 SETU  ; 内齿轮右齿
    PUSH 32 PUSH 11 PUSH #x2591 SETU  ; 内齿轮下齿
    
    ;; 技术电路连接 - 专业的技术连接
    PUSH 30 PUSH 12 PUSH #x2571 SETU  ; 左上电路连接
    PUSH 28 PUSH 14 PUSH #x2571 SETU  ; 连接线
    PUSH 26 PUSH 16 PUSH #x2571 SETU  ; 连接线
    PUSH 24 PUSH 18 PUSH #x2571 SETU  ; 连接线
    
    PUSH 34 PUSH 12 PUSH #x2572 SETU  ; 右上电路连接
    PUSH 36 PUSH 14 PUSH #x2572 SETU  ; 连接线
    PUSH 38 PUSH 16 PUSH #x2572 SETU  ; 连接线
    PUSH 40 PUSH 18 PUSH #x2572 SETU  ; 连接线
    
    ;; 技术处理核心 - 多层处理单元
    PUSH 32 PUSH 24 PUSH #x25A0 SETU  ; 主处理器
    PUSH 30 PUSH 23 PUSH #x2588 SETU  ; 处理器左扩展
    PUSH 34 PUSH 23 PUSH #x2588 SETU  ; 处理器右扩展
    PUSH 32 PUSH 25 PUSH #x2588 SETU  ; 处理器下扩展
    
    ;; 数据流网络 - 技术协会的数据交换
    PUSH 22 PUSH 26 PUSH #x2192 SETU  ; 左输入箭头
    PUSH 24 PUSH 26 PUSH #x2192 SETU  ; 输入流
    PUSH 26 PUSH 26 PUSH #x2192 SETU  ; 输入流
    PUSH 28 PUSH 26 PUSH #x2192 SETU  ; 输入流
    
    PUSH 36 PUSH 26 PUSH #x2190 SETU  ; 右输入箭头
    PUSH 38 PUSH 26 PUSH #x2190 SETU  ; 输入流
    PUSH 40 PUSH 26 PUSH #x2190 SETU  ; 输入流
    PUSH 42 PUSH 26 PUSH #x2190 SETU  ; 输入流
    
    PUSH 32 PUSH 28 PUSH #x2193 SETU  ; 下输出箭头
    PUSH 32 PUSH 30 PUSH #x2193 SETU  ; 输出流
    PUSH 32 PUSH 32 PUSH #x2193 SETU  ; 输出流
    
    ;; 技术代码背景 - 专业的技术符号
    PUSH 18 PUSH 34 PUSH #x03A3 SETU  ; Sigma符号(求和)
    PUSH 20 PUSH 34 PUSH #x03A9 SETU  ; Omega符号
    PUSH 22 PUSH 34 PUSH #x2200 SETU  ; 全称量词
    PUSH 24 PUSH 34 PUSH #x2203 SETU  ; 存在量词
    
    PUSH 40 PUSH 34 PUSH #x2211 SETU  ; 求和符号
    PUSH 42 PUSH 34 PUSH #x222B SETU  ; 积分符号
    PUSH 44 PUSH 34 PUSH #x2202 SETU  ; 偏微分符号
    PUSH 46 PUSH 34 PUSH #x2207 SETU  ; 梯度符号
    
    ;; 二进制技术流 - 专业的技术数据（使用INC/DEC优化）
    PUSH 18 PUSH 36 PUSH #x30 SETU    ; 0
    PUSH 19 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 20 PUSH 36 PUSH #x30 SETU    ; 0
    PUSH 21 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 22 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 23 PUSH 36 PUSH #x30 SETU    ; 0
    
    PUSH 41 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 42 PUSH 36 PUSH #x30 SETU    ; 0
    PUSH 43 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 44 PUSH 36 PUSH #x30 SETU    ; 0
    PUSH 45 PUSH 36 PUSH #x31 SETU    ; 1
    PUSH 46 PUSH 36 PUSH #x31 SETU    ; 1
    
    ;; 协会全称 - 三体自动化技术协会（使用INC优化）
    PUSH 20 PUSH 40 PUSH #x4E09 SETU  ; 三
    PUSH 22 PUSH 40 PUSH #x4F53 SETU  ; 体
    PUSH 24 PUSH 40 PUSH #x81EA SETU  ; 自
    PUSH 26 PUSH 40 PUSH #x52A8 SETU  ; 动
    PUSH 28 PUSH 40 PUSH #x5316 SETU  ; 化
    PUSH 30 PUSH 40 PUSH #x6280 SETU  ; 技
    PUSH 32 PUSH 40 PUSH #x672F SETU  ; 术
    PUSH 34 PUSH 40 PUSH #x534F SETU  ; 协
    PUSH 36 PUSH 40 PUSH #x4F1A SETU  ; 会
    
    ;; 英文缩写 - TATA (Three-body Automation Technology Association)
    PUSH 26 PUSH 42 PUSH #x54 SETU    ; T
    PUSH 28 PUSH 42 PUSH #x41 SETU    ; A
    PUSH 30 PUSH 42 PUSH #x54 SETU    ; T
    PUSH 32 PUSH 42 PUSH #x41 SETU    ; A
    
    ;; 技术年份标识
    PUSH 38 PUSH 42 PUSH #x32 SETU    ; 2
    PUSH 39 PUSH 42 PUSH #x30 SETU    ; 0
    PUSH 40 PUSH 42 PUSH #x32 SETU    ; 2
    PUSH 41 PUSH 42 PUSH #x35 SETU    ; 5
    
    ;; 专业边框设计 - 使用循环绘制边框（使用INC优化）
    
    ;; 绘制四个角
    PUSH 16 PUSH 6 PUSH #x2554 SETU   ; 双线左上角
    PUSH 48 PUSH 6 PUSH #x2557 SETU   ; 双线右上角
    PUSH 16 PUSH 44 PUSH #x255A SETU  ; 双线左下角
    PUSH 48 PUSH 44 PUSH #x255D SETU  ; 双线右下角
    
    ;; 使用循环绘制上边框（使用INC优化）
    PUSH 17           ; 初始x=17
    top_border_loop:
    DUP              ; 复制x
    PUSH 6           ; y=6
    PUSH #x2550      ; 水平边框字符
    SETU             ; 设置字符
    
    INC              ; 使用INC指令替代PUSH 1 ADD
    DUP              ; 复制x
    PUSH 48          ; 检查x是否小于48
    LT
    JUMPIF top_border_loop  ; 如果x<48，继续循环
    
    POP              ; 弹出x
    
    ;; 使用循环绘制下边框（使用INC优化）
    PUSH 17           ; 初始x=17
    bottom_border_loop:
    DUP              ; 复制x
    PUSH 44          ; y=44
    PUSH #x2550      ; 水平边框字符
    SETU             ; 设置字符
    
    INC              ; 使用INC指令替代PUSH 1 ADD
    DUP              ; 复制x
    PUSH 48          ; 检查x是否小于48
    LT
    JUMPIF bottom_border_loop  ; 如果x<48，继续循环
    
    POP              ; 弹出x
    
    ;; 使用循环绘制左边框（使用INC优化）
    PUSH 7            ; 初始y=7
    left_border_loop:
    DUP              ; 复制y
    PUSH 16          ; x=16
    SWAP             ; 交换x和y
    PUSH #x2551      ; 垂直边框字符
    SETU             ; 设置字符
    
    INC              ; 使用INC指令替代PUSH 1 ADD
    DUP              ; 复制y
    PUSH 44          ; 检查y是否小于44
    LT
    JUMPIF left_border_loop  ; 如果y<44，继续循环
    
    POP              ; 弹出y
    
    ;; 使用循环绘制右边框（使用INC优化）
    PUSH 7            ; 初始y=7
    right_border_loop:
    DUP              ; 复制y
    PUSH 48          ; x=48
    SWAP             ; 交换x和y
    PUSH #x2551      ; 垂直边框字符
    SETU             ; 设置字符
    
    INC              ; 使用INC指令替代PUSH 1 ADD
    DUP              ; 复制y
    PUSH 44          ; 检查y是否小于44
    LT
    JUMPIF right_border_loop  ; 如果y<44，继续循环
    
    POP              ; 弹出y
    
    HLT


